package control

import (
	"admin/src/global"
	"admin/src/log"
	"admin/src/models"
	"admin/src/res"
	"fmt"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

type MenuRoleController struct{}

func (*MenuRoleController) CreateMenuRole(c *gin.Context) {
	var req models.RoleMenuModel
	if err := c.ShouldBind(&req); err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("参数错误", zap.Error(err))
		return
	}
	result := global.DB.Where(req).First(&req)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("权限已存在", zap.Error(result.Error))
		return
	}

	result = global.DB.Create(&req)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("创建失败", zap.Error(result.Error))
		return
	}
	res.Ok(c, req)
}

func (*MenuRoleController) GetMenuRolesList(c *gin.Context) {
	var roleId int
	var menusIds []int
	err := c.ShouldBind(&roleId)
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("参数错误", zap.Error(err))
		return
	}
	result := global.DB.Model(&models.RoleMenuModel{}).
		Select("menu_id").
		Where("role_id = ?", roleId).
		Find(&menusIds)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("", zap.Error(result.Error))
		return
	}
	res.Ok(c, menusIds)
}

func (*MenuRoleController) UpdateMenuRole(c *gin.Context) {
	var req models.RoleMenuModel
	err := c.ShouldBind(&req)
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("", zap.Error(err))
		return
	}
	result := global.DB.Model(&models.RoleMenuModel{}).Where("id = ?", req.ID).Updates(req)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("更新失败", zap.Error(result.Error))
		return
	}
	res.Ok(c, req)
}

func (*MenuRoleController) DeleteMenuRole(c *gin.Context) {
	tx := global.DB.Begin()
	var ids []int
	err := c.ShouldBind(&ids)
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("参数错误", zap.Error(err))
		tx.Rollback()
		return
	}
	result := tx.Delete(&models.RoleMenuModel{}, ids)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("删除失败", zap.Error(result.Error))
		return
	}
	res.Ok(c, fmt.Sprintf("成功删除了%d条数据", result.RowsAffected))
	tx.Commit()
}
